<?php

abstract class Controller_Abstract extends PController_Abstract 
{
    /**
     * 运行时上下文
     *
     * @var PContext
     */
    protected $context;
    
    /**
     * 视图
     *
     * @var array
     */
    protected $_view = array();
    
    /**
     * 控制器要使用的视图
     *
     * @var string
     */
    protected $_viewname = null;
    
    /**
     * 控制器要使用的视图类
     *
     * @var string
     */
    protected $_view_class = 'View_Render_PHP';

    public function __construct()
    {
        parent::__construct();
        
    }
    
    /**
     * 检查指定的动作方法是否存在
     *
     * @param string $action_name
     *
     * @return boolean
     */
    public function exists_action($action_name)
    {
        $action_method = "{$action_name}Action";
        return method_exists($this, $action_method);
    }
    
    /**
     * 执行指定的动作
     *
     * @return mixed
     */
    function execute($action_name, array $args = array())
    {
        $action_method = "{$action_name}Action";

        // 执行指定的动作方法
        $this->_before_execute();

        $response = call_user_func_array(array($this, $action_method), $args);
        $this->_after_execute($response);
        if (is_null($response) && is_array($this->_view))
        {
            // 如果动作没有返回值，并且 $this->view 不为 null，
            // 则假定动作要通过 $this->view 输出数据
            $config = array('view_dir' => $this->_getViewDir());
            $response = new $this->_view_class($config);
            $response->setViewname($this->_getViewName())->assign($this->_view);
            $this->_before_render($response);
        }
        elseif ($response instanceof $this->_view_class)
        {
            $response->assign($this->_view);
            $this->_before_render($response);
        }
        return $response;
    }
    
    /**
     * 返回最后一次出错的错误信息
     *
     * @return string
     */
    protected function _getLastError()
    {
        if (function_exists('error_get_last'))
        {
            $error = error_get_last();
            if (!empty($error['message']))
            {
                $error = strip_tags($error['message']);
            }
        }
        else
        {
            $error = '';
        }
        return $error;
    }
    
    /**
     * 执行控制器动作之前调用
     */
    protected function _before_execute()
    {
    }
    
    /**
     * 执行控制器动作之后调用
     *
     * @param mixed $response
     */
    protected function _after_execute(& $response)
    {
    }
    
    /**
     * 准备视图目录
     *
     * @return array
     */
    protected function _getViewDir()
    {
        return dirname(dirname(__FILE__)) . DS . 'templates';
    }
    
    /**
     * 确定要使用的视图
     *
     * @return string
     */
    protected function _getViewName()
    {
        if ($this->_viewname === false)
        {
            return false;
        }
        $viewname = empty($this->_viewname) ? $this->context->action_name : $this->_viewname;
        return strtolower("{$this->context->controller_name}/{$viewname}");
    }

    /**
     * 显示一个提示页面，然后重定向浏览器到新地址
     *
     * @param string $caption
     * @param string $message
     * @param string $url
     * @param int $delay
     * @param string $script
     *
     * @return PView_Render_PHP
     */
    protected function _redirectMessage($url, $message = '', $delay = 5, $caption = '',  $script = '')
    {
        return parent::_redirectMessage($url, $message, $delay, $caption, $script);
    }
    
    public function _on_action_not_defined()
    {
        
    }
    
    
    /**
     * 渲染之前调用
     *
     * @param QView_Render_PHP
     */
    protected function _before_render($response)
    {
    }
}
